///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	// Проверка прав доступа должна располагаться самой первой.
	Если Не ПравоДоступа("Администрирование", Метаданные) Тогда
		ВызватьИсключение НСтр("ru = 'Использование обработки в интерактивном режиме доступно только администратору.'");
	КонецЕсли;

	ПроверитьВерсиюИРежимСовместимостиПлатформы();

	Объект.ЭтоИнтерактивныйРежим = Истина;
	Объект.БезопасныйРежим = Истина;
	Объект.КодировкаФайлаПротоколаОбмена = "КодировкаТекста.UTF8";

	ЗаголовокФормы = НСтр("ru = 'Универсальный обмен данными в формате XML (%ВерсияОбработки%)'");
	ЗаголовокФормы = СтрЗаменить(ЗаголовокФормы, "%ВерсияОбработки%", ВерсияОбъектаСтрокойНаСервере());

	Заголовок = ЗаголовокФормы;

	ЗаполнитьСписокТиповДоступныхДляУдаления();
	УИ_ОбщегоНазначения.ФормаИнструментаПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);

КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)

	Элементы.ИмяФайлаПравил.СписокВыбора.ЗагрузитьЗначения(ПравилаОбмена.ВыгрузитьЗначения());
	Элементы.ИмяФайлаОбмена.СписокВыбора.ЗагрузитьЗначения(ЗагрузкаДанныхИхФайла.ВыгрузитьЗначения());
	Элементы.ИмяФайлаДанных.СписокВыбора.ЗагрузитьЗначения(ВыгрузкаДанныхВФайл.ВыгрузитьЗначения());

	ПриИзмененииПериода();

	ПриИзмененииТипаУдаленияРегистрацииИзменений();

	ОчиститьДанныеОФайлеДляЗагрузкиДанных();

	ПрямаяВыгрузка = ?(Объект.НепосредственноеЧтениеВИБПриемнике, 1, 0);

	СохраненныйРежимЗагрузки = (Объект.РежимОбмена = "Загрузка");

	Если СохраненныйРежимЗагрузки Тогда
		
		// Нужную страницу устанавливаем.
		Элементы.ГлавнаяПанельФормы.ТекущаяСтраница = Элементы.ГлавнаяПанельФормы.ПодчиненныеЭлементы.Загрузка;

	КонецЕсли;

	ОбработатьДоступностьЭлементовУправленияТранзакциями();

	РазвернутьСтрокиДерева(УдаляемыеДанные, Элементы.УдаляемыеДанные, "Пометка");

	АрхивироватьФайлПриИзмененииЗначения();
	ПрямаяВыгрузкаПриИзмененииЗначения();

	ИзменитьРежимОбработки(ЭтоКлиент);

#Если ВебКлиент Тогда
	Элементы.СтраницыОтладкиВыгрузки.ТекущаяСтраница = Элементы.СтраницыОтладкиВыгрузки.ПодчиненныеЭлементы.ГруппаВыгрузкаВебКлиент;
	Элементы.СтраницыОтладкиЗагрузки.ТекущаяСтраница = Элементы.СтраницыОтладкиЗагрузки.ПодчиненныеЭлементы.ГруппаЗагрузкаВебКлиент;
	Объект.ФлагРежимОтладкиОбработчиков = Ложь;
#КонецЕсли

	УстановитьДоступностьКомандОтладки();

	Если СохраненныйРежимЗагрузки И Объект.НастройкаАвтоматическойЗагрузкиДанных <> 0 Тогда

		Если Объект.НастройкаАвтоматическойЗагрузкиДанных = 1 Тогда

			ОписаниеОповещения = Новый ОписаниеОповещения("ПриОткрытииЗавершение", ЭтотОбъект);
			ПоказатьВопрос(ОписаниеОповещения, НСтр("ru = 'Выполнить загрузку данных из файла обмена?'"),
				РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да);

		Иначе

			ПриОткрытииЗавершение(КодВозвратаДиалога.Да, Неопределено);

		КонецЕсли;

	КонецЕсли;

	Если Не ЭтоWindowsКлиент() Тогда
		Элементы.ГруппаОС.ТекущаяСтраница = Элементы.ГруппаОС.ПодчиненныеЭлементы.ГруппаLinux;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытииЗавершение(Результат, ДополнительныеПараметры) Экспорт

	Если Результат = КодВозвратаДиалога.Да Тогда

		ВыполнитьЗагрузкуИзФормы();
		ПредставлениеПериодаВыгрузки = ПредставлениеПериода(Объект.ДатаНачала, Объект.ДатаОкончания);

	КонецЕсли;

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура АрхивироватьФайлПриИзменении(Элемент)

	АрхивироватьФайлПриИзмененииЗначения();

КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПравилОбменаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

	ВыборФайла(Элемент, ЭтотОбъект, "ИмяФайлаПравил", Истина, , Ложь, Истина);

КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПравилОбменаОткрытие(Элемент, СтандартнаяОбработка)

	ОткрытьВПриложении(Элемент.ТекстРедактирования, СтандартнаяОбработка);

КонецПроцедуры

&НаКлиенте
Процедура ПрямаяВыгрузкаПриИзменении(Элемент)

	ПрямаяВыгрузкаПриИзмененииЗначения();

КонецПроцедуры

&НаКлиенте
Процедура ГлавнаяПанельФормыПриСменеСтраницы(Элемент, ТекущаяСтраница)

	Если ТекущаяСтраница.Имя = "Выгрузка" Тогда

		Объект.РежимОбмена = "Выгрузка";

	ИначеЕсли ТекущаяСтраница.Имя = "Загрузка" Тогда

		Объект.РежимОбмена = "Загрузка";

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ФлагРежимОтладкиПриИзменении(Элемент)

	Если Объект.ФлагРежимОтладки Тогда

		Объект.ИспользоватьТранзакции = Ложь;

	КонецЕсли;

	ОбработатьДоступностьЭлементовУправленияТранзакциями();

КонецПроцедуры

&НаКлиенте
Процедура КоличествоОбработанныхОбъектовДляОбновленияСтатусаПриИзменении(Элемент)

	Если Объект.КоличествоОбработанныхОбъектовДляОбновленияСтатуса = 0 Тогда
		Объект.КоличествоОбработанныхОбъектовДляОбновленияСтатуса = 100;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаОбменаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

	ВыборФайла(Элемент, ЭтотОбъект, "ИмяФайлаОбмена", Ложь, , Объект.АрхивироватьФайл);

КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПротоколаОбменаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

	ВыборФайла(Элемент, Объект, "ИмяФайлаПротоколаОбмена", Ложь, "txt", Ложь);

КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПротоколаОбменаЗагрузкаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

	ВыборФайла(Элемент, Объект, "ИмяФайлаПротоколаОбменаЗагрузка", Ложь, "txt", Ложь);

КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаДанныхНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

	ВыборФайла(Элемент, ЭтотОбъект, "ИмяФайлаДанных", Ложь, , Объект.АрхивироватьФайл);

КонецПроцедуры

&НаКлиенте
Процедура КаталогИнформационнойБазыДляПодключенияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);

	ДиалогВыбораФайла.Заголовок = НСтр("ru = 'Выберите каталог информационной базы'");
	ДиалогВыбораФайла.Каталог = Объект.КаталогИнформационнойБазыДляПодключения;
	ДиалогВыбораФайла.ПроверятьСуществованиеФайла = Истина;

	Оповещение = Новый ОписаниеОповещения("КаталогИнформационнойБазыДляПодключенияОбработкаВыбора", ЭтотОбъект);
	ДиалогВыбораФайла.Показать(Оповещение);

КонецПроцедуры

&НаКлиенте
Процедура КаталогИнформационнойБазыДляПодключенияОбработкаВыбора(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Объект.КаталогИнформационнойБазыДляПодключения = ВыбранныеФайлы[0];

КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПротоколаОбменаОткрытие(Элемент, СтандартнаяОбработка)

	ОткрытьВПриложении(Элемент.ТекстРедактирования, СтандартнаяОбработка);

КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПротоколаОбменаЗагрузкаОткрытие(Элемент, СтандартнаяОбработка)

	ОткрытьВПриложении(Элемент.ТекстРедактирования, СтандартнаяОбработка);

КонецПроцедуры

&НаКлиенте
Процедура КаталогИнформационнойБазыДляПодключенияОткрытие(Элемент, СтандартнаяОбработка)

	ОткрытьВПриложении(Элемент.ТекстРедактирования, СтандартнаяОбработка);

КонецПроцедуры

&НаКлиенте
Процедура АутентификацияWindowsИнформационнойБазыДляПодключенияПриИзменении(Элемент)

	Элементы.ПользовательИнформационнойБазыДляПодключения.Доступность = Не Объект.АутентификацияWindowsИнформационнойБазыДляПодключения;
	Элементы.ПарольИнформационнойБазыДляПодключения.Доступность = Не Объект.АутентификацияWindowsИнформационнойБазыДляПодключения;

КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПравилПриИзменении(Элемент)

	Файл = Новый Файл(ИмяФайлаПравил);

	Оповещение = Новый ОписаниеОповещения("ИмяФайлаПравилПослеПроверкиСуществования", ЭтотОбъект);
	Файл.НачатьПроверкуСуществования(Оповещение);

КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПравилПослеПроверкиСуществования(Существует, ДополнительныеПараметры) Экспорт

	Если Не Существует Тогда
		СообщитьПользователю(НСтр("ru = 'Не найден файл правил обмена'"), "ИмяФайлаПравил");
		УстановитьПризнакЗагрузкиПравил(Ложь);
		Возврат;
	КонецЕсли;

	Если ИменаФайловПравилИОбменаСовпадают() Тогда
		Возврат;
	КонецЕсли;

	ОписаниеОповещения = Новый ОписаниеОповещения("ИмяФайлаПравилПриИзмененииЗавершение", ЭтотОбъект);
	ПоказатьВопрос(ОписаниеОповещения, НСтр("ru = 'Загрузить правила обмена данными?'"), РежимДиалогаВопрос.ДаНет, ,
		КодВозвратаДиалога.Да);

КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПравилПриИзмененииЗавершение(Результат, ДополнительныеПараметры) Экспорт

	Если Результат = КодВозвратаДиалога.Да Тогда

		ВыполнитьЗагрузкуПравилОбмена();

	Иначе

		УстановитьПризнакЗагрузкиПравил(Ложь);

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаОбменаОткрытие(Элемент, СтандартнаяОбработка)

	ОткрытьВПриложении(Элемент.ТекстРедактирования, СтандартнаяОбработка);

КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаОбменаПриИзменении(Элемент)

	ОчиститьДанныеОФайлеДляЗагрузкиДанных();

КонецПроцедуры

&НаКлиенте
Процедура ИспользоватьТранзакцииПриИзменении(Элемент)

	ОбработатьДоступностьЭлементовУправленияТранзакциями();

КонецПроцедуры

&НаКлиенте
Процедура ФлагРежимОтладкиОбработчиковЗагрузкиПриИзменении(Элемент)

	УстановитьДоступностьКомандОтладки();

КонецПроцедуры

&НаКлиенте
Процедура ФлагРежимОтладкиОбработчиковВыгрузкиПриИзменении(Элемент)

	УстановитьДоступностьКомандОтладки();

КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаДанныхОткрытие(Элемент, СтандартнаяОбработка)

	ОткрытьВПриложении(Элемент.ТекстРедактирования, СтандартнаяОбработка);

КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаДанныхПриИзменении(Элемент)

	Если ПустоеЗначениеРеквизита(ИмяФайлаДанных, "ИмяФайлаДанных", Элементы.ИмяФайлаДанных.Заголовок)
		Или ИменаФайловПравилИОбменаСовпадают() Тогда
		Возврат;
	КонецЕсли;

	Объект.ИмяФайлаОбмена = ИмяФайлаДанных;

	Файл = Новый Файл(Объект.ИмяФайлаОбмена);
	Объект.АрхивироватьФайл = (ВРЕГ(Файл.Расширение) = ВРЕГ(".zip"));

КонецПроцедуры

&НаКлиенте
Процедура ТипИнформационнойБазыДляПодключенияПриИзменении(Элемент)

	ТипИнформационнойБазыДляПодключенияПриИзмененииЗначения();

КонецПроцедуры

&НаКлиенте
Процедура ВерсияПлатформыИнформационнойБазыДляПодключенияПриИзменении(Элемент)

	Если ПустаяСтрока(Объект.ВерсияПлатформыИнформационнойБазыДляПодключения) Тогда

		Объект.ВерсияПлатформыИнформационнойБазыДляПодключения = "V8";

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузкиПриИзменении(Элемент)

	ПриИзмененииТипаУдаленияРегистрацииИзменений();

КонецПроцедуры

&НаКлиенте
Процедура ПериодВыгрузкиПриИзменении(Элемент)

	ПриИзмененииПериода();

КонецПроцедуры

&НаКлиенте
Процедура ПериодУдаленияПриИзменении(Элемент)

	ПриИзмененииПериода();

КонецПроцедуры

&НаКлиенте
Процедура БезопаснаяЗагрузкаПриИзменении(Элемент)

	ИзменитьРежимБезопаснаяЗагрузка();

КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПравилЗагрузкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

	ВыборФайла(Элемент, ЭтотОбъект, "ИмяФайлаПравилЗагрузки", Истина, , Ложь, Истина);

КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаПравилЗагрузкиПриИзменении(Элемент)

	ПоместитьФайлПравилЗагрузкиВХранилище();

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыТаблицаПравилВыгрузки

&НаКлиенте
Процедура ТаблицаПравилВыгрузкиПередНачаломИзменения(Элемент, Отказ)

	Если Элемент.ТекущийЭлемент.Имя = "СсылкаНаУзелОбмена" Тогда

		Если Элемент.ТекущиеДанные.ЭтоГруппа Тогда
			Отказ = Истина;
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ТаблицаПравилВыгрузкиПриИзменении(Элемент)

	Если Элемент.ТекущийЭлемент.Имя = "ПВД" Тогда

		ТекСтрока = Элемент.ТекущиеДанные;

		Если ТекСтрока.Включить = 2 Тогда
			ТекСтрока.Включить = 0;
		КонецЕсли;

		УстановитьПометкиПодчиненных(ТекСтрока, "Включить");
		УстановитьПометкиРодителей(ТекСтрока, "Включить");

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ТаблицаПравилВыгрузкиОтборНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

	ТекущаяСтрока = Элементы.ТаблицаПравилВыгрузки.ТекущиеДанные;

	Если ТекущаяСтрока = Неопределено Тогда
		СтандартнаяОбработка = Ложь;
		Возврат;
	КонецЕсли;

	Если ТекущаяСтрока.ИмяМетаданных = "" Тогда
		СтандартнаяОбработка = Ложь;
		Возврат;
	КонецЕсли;

	КомпоновщикНастроек = ИнициализироватьКомпоновщикНастроекОтбораПравилВыгрузки(
		Элементы.ТаблицаПравилВыгрузки.ТекущаяСтрока);
	ТекущаяСтрока.Отбор = КомпоновщикНастроек.Настройки.Отбор;

КонецПроцедуры
&НаКлиенте
Процедура ТаблицаПравилВыгрузкиОтборПриИзменении(Элемент)
	ТекущаяСтрока = Элементы.ТаблицаПравилВыгрузки.ТекущиеДанные;
	Если ТекущаяСтрока.Отбор.Элементы.Количество() > 0 Тогда
		ТекущаяСтрока.ИспользоватьОтбор = Истина;
	Иначе
		ТекущаяСтрока.ИспользоватьОтбор = Ложь;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаПравилВыгрузкиОтборОчистка(Элемент, СтандартнаяОбработка)
	ТекущаяСтрока = Элементы.ТаблицаПравилВыгрузки.ТекущиеДанные;
	Если ТекущаяСтрока.Отбор.Элементы.Количество() > 0 Тогда
		ТекущаяСтрока.ИспользоватьОтбор = Истина;
	Иначе
		ТекущаяСтрока.ИспользоватьОтбор = Ложь;
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыУдаляемыеДанные

&НаКлиенте
Процедура УдаляемыеДанныеПриИзменении(Элемент)

	ТекСтрока = Элемент.ТекущиеДанные;

	УстановитьПометкиПодчиненных(ТекСтрока, "Пометка");
	УстановитьПометкиРодителей(ТекСтрока, "Пометка");

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ТестПодключения(Команда)

	ВыполнитьПодключениеКИБПриемникуНаСервере();

КонецПроцедуры

&НаКлиенте
Процедура ПолучитьИнформациюОФайлеОбмена(Команда)

	АдресФайла = "";

	Если ЭтоКлиент Тогда

		ОписаниеОповещения = Новый ОписаниеОповещения("ПолучитьИнформациюОФайлеОбменаЗавершение", ЭтотОбъект);
		НачатьПомещениеФайла(ОписаниеОповещения, АдресФайла, , , УникальныйИдентификатор);

	Иначе

		ПолучитьИнформациюОФайлеОбменаЗавершение(Истина, АдресФайла, "", Неопределено);

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПолучитьИнформациюОФайлеОбменаЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт

	Если Результат Тогда

		Попытка

			ОткрытьФайлЗагрузкиНаСервере(Адрес);
			ПредставлениеПериодаВыгрузки = ПредставлениеПериода(Объект.ДатаНачала, Объект.ДатаОкончания);

		Исключение

			СообщитьПользователю(НСтр("ru = 'Не удалось прочитать файл обмена.'"));
			ОчиститьДанныеОФайлеДляЗагрузкиДанных();

		КонецПопытки;

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура УдалениеОтметитьВсе(Команда)

	Для Каждого Строка Из УдаляемыеДанные.ПолучитьЭлементы() Цикл

		Строка.Пометка = 1;
		УстановитьПометкиПодчиненных(Строка, "Пометка");

	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура УдалениеОтменитьВсе(Команда)

	Для Каждого Строка Из УдаляемыеДанные.ПолучитьЭлементы() Цикл
		Строка.Пометка = 0;
		УстановитьПометкиПодчиненных(Строка, "Пометка");
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура УдалениеУдалить(Команда)

	ОписаниеОповещения = Новый ОписаниеОповещения("УдалениеУдалитьЗавершение", ЭтотОбъект);
	ПоказатьВопрос(ОписаниеОповещения, НСтр("ru = 'Удалить выбранные данные в информационной базе?'"),
		РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет);

КонецПроцедуры

&НаКлиенте
Процедура УдалениеУдалитьЗавершение(Результат, ДополнительныеПараметры) Экспорт

	Если Результат = КодВозвратаДиалога.Да Тогда

		УдалитьНаСервере();

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ВыгрузкаОтметитьВсе(Команда)

	Для Каждого Строка Из Объект.ТаблицаПравилВыгрузки.ПолучитьЭлементы() Цикл
		Строка.Включить = 1;
		УстановитьПометкиПодчиненных(Строка, "Включить");
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ВыгрузкаОтменитьВсе(Команда)

	Для Каждого Строка Из Объект.ТаблицаПравилВыгрузки.ПолучитьЭлементы() Цикл
		Строка.Включить = 0;
		УстановитьПометкиПодчиненных(Строка, "Включить");
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ВыгрузкаОчиститьУзлыОбмена(Команда)

	УстановитьУзелОбменаУСтрокДереваНаСервере(Неопределено);

КонецПроцедуры

&НаКлиенте
Процедура ВыгрузкаУстановитьУзелОбмена(Команда)

	Если Элементы.ТаблицаПравилВыгрузки.ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	УстановитьУзелОбменаУСтрокДереваНаСервере(Элементы.ТаблицаПравилВыгрузки.ТекущиеДанные.СсылкаНаУзелОбмена);

КонецПроцедуры

&НаКлиенте
Процедура СохранитьПараметры(Команда)

	СохранитьПараметрыНаСервере();

КонецПроцедуры

&НаКлиенте
Процедура ВосстановитьПараметры(Команда)

	ВосстановитьПараметрыНаСервере();

КонецПроцедуры

&НаКлиенте
Процедура НастройкаОтладкиВыгрузки(Команда)

	Объект.ИмяФайлаПравилОбмена = ИмяФайлаНаСервереИлиКлиенте(ИмяФайлаПравил, АдресФайлаПравилВХранилище);

	ОткрытьФормуНастройкиОтладкиОбработчиков(Истина);

КонецПроцедуры

&НаКлиенте
Процедура НаКлиенте(Команда)

	Если Не ЭтоКлиент Тогда

		ЭтоКлиент = Истина;

		ИзменитьРежимОбработки(ЭтоКлиент);

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура НаСервере(Команда)

	Если ЭтоКлиент Тогда

		ЭтоКлиент = Ложь;

		ИзменитьРежимОбработки(ЭтоКлиент);

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура НастройкаОтладкиЗагрузки(Команда)

	АдресФайлаОбменаВХранилище = "";
	ИмяФайлаДляРасширения = "";

	Если ЭтоКлиент Тогда

		ОписаниеОповещения = Новый ОписаниеОповещения("НастройкаОтладкиЗагрузкиЗавершение", ЭтотОбъект);
		НачатьПомещениеФайла(ОписаниеОповещения, АдресФайлаОбменаВХранилище, , , УникальныйИдентификатор);

	Иначе

		Если ПустоеЗначениеРеквизита(ИмяФайлаОбмена, "ИмяФайлаОбмена", Элементы.ИмяФайлаОбмена.Заголовок) Тогда
			Возврат;
		КонецЕсли;

		НастройкаОтладкиЗагрузкиЗавершение(Истина, АдресФайлаОбменаВХранилище, ИмяФайлаДляРасширения, Неопределено);

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура НастройкаОтладкиЗагрузкиЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт

	Если Результат Тогда

		Объект.ИмяФайлаОбмена = ИмяФайлаНаСервереИлиКлиенте(ИмяФайлаОбмена, Адрес, ВыбранноеИмяФайла);

		ОткрытьФормуНастройкиОтладкиОбработчиков(Ложь);

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьВыгрузку(Команда)

	ВыполнитьВыгрузкуИзФормы();

КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьЗагрузку(Команда)

	ВыполнитьЗагрузкуИзФормы();

КонецПроцедуры

&НаКлиенте
Процедура ПрочитатьПравилаОбмена(Команда)

	Если Не ЭтоWindowsКлиент() И ПрямаяВыгрузка = 1 Тогда
		ПоказатьПредупреждение( , НСтр(
			"ru = 'Прямое подключение к информационной базе поддерживается только в клиенте под управлением ОС Windows.'"));
		Возврат;
	КонецЕсли;

	ИмяФайлаДляРасширения = "";

	Если ЭтоКлиент Тогда

		ОписаниеОповещения = Новый ОписаниеОповещения("ПрочитатьПравилаОбменаЗавершение", ЭтотОбъект);
		НачатьПомещениеФайла(ОписаниеОповещения, АдресФайлаПравилВХранилище, , , УникальныйИдентификатор);

	Иначе

		АдресФайлаПравилВХранилище = "";
		Если ПустоеЗначениеРеквизита(ИмяФайлаПравил, "ИмяФайлаПравил", Элементы.ИмяФайлаПравил.Заголовок) Тогда
			Возврат;
		КонецЕсли;

		ПрочитатьПравилаОбменаЗавершение(Истина, АдресФайлаПравилВХранилище, ИмяФайлаДляРасширения, Неопределено);

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПрочитатьПравилаОбменаЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт

	Если Результат Тогда

		АдресФайлаПравилВХранилище = Адрес;

		ВыполнитьЗагрузкуПравилОбмена(Адрес, ВыбранноеИмяФайла);

		Если Объект.ФлагОшибки Тогда

			УстановитьПризнакЗагрузкиПравил(Ложь);

		Иначе

			УстановитьПризнакЗагрузкиПравил(Истина);

		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура УИ_ТестПодключенияКВебСервису(Команда)
	Если РезультатТестаПодключенияКВебсервисуНаСервере() Тогда
		ПоказатьПредупреждение( , "Тест подключения пройден успешно");
	КонецЕсли;
КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ВыполнитьОбщуюКомандуИнструментов(Команда) 
	УИ_ОбщегоНазначенияКлиент.Подключаемый_ВыполнитьОбщуюКомандуИнструментов(ЭтотОбъект, Команда);
КонецПроцедуры


#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Функция РезультатТестаПодключенияКВебсервисуНаСервере()
	Путь=Объект.УИ_АдресПубликацииПриемника + "/hs/tools-ui-1c/ping";

	ДопПараметры=Новый Структура;
	ДопПараметры.Вставить("Таймаут", 10);

	Аутентификация=Новый Структура;
	Аутентификация.Вставить("Пользователь", Объект.ПользовательИнформационнойБазыДляПодключения);
	Аутентификация.Вставить("Пароль", Объект.ПарольИнформационнойБазыДляПодключения);
	ДопПараметры.Вставить("Аутентификация", Аутентификация);

	Попытка
		РезультатПодключения=УИ_КоннекторHTTP.Get(Путь, , ДопПараметры);
		РезультатПодключения=УИ_КоннекторHTTP.КакТекст(РезультатПодключения);
	Исключение
		РезультатПодключения=Неопределено;
		СообщитьПользователю(ОписаниеОшибки());
	КонецПопытки;
	Возврат РезультатПодключения = "OK";
	
КонецФункции

// Открывает файл обмена во внешнем приложении.
//
// Параметры:
//  
// 
&НаКлиенте
Процедура ОткрытьВПриложении(ИмяФайла, СтандартнаяОбработка = Ложь)

	СтандартнаяОбработка = Ложь;

	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ИмяФайла", ИмяФайла);
	ДополнительныеПараметры.Вставить("ОписаниеОповещения", Новый ОписаниеОповещения);

	Файл = Новый Файл(ИмяФайла);

	ОписаниеОповещения = Новый ОписаниеОповещения("ПослеОпределенияСуществованияФайла", ЭтотОбъект,
		ДополнительныеПараметры);
	Файл.НачатьПроверкуСуществования(ОписаниеОповещения);

КонецПроцедуры

// Продолжение процедуры (см. выше).
&НаКлиенте
Процедура ПослеОпределенияСуществованияФайла(Существует, ДополнительныеПараметры) Экспорт

	Если Существует Тогда
		НачатьЗапускПриложения(ДополнительныеПараметры.ОписаниеОповещения, ДополнительныеПараметры.ИмяФайла);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ОчиститьДанныеОФайлеДляЗагрузкиДанных()

	Объект.ВерсияПравилОбмена = "";
	Объект.ДатаВыгрузкиДанных = "";
	ПредставлениеПериодаВыгрузки = "";

КонецПроцедуры

&НаКлиенте
Процедура ОбработатьДоступностьЭлементовУправленияТранзакциями()

	Элементы.ИспользоватьТранзакции.Доступность = Не Объект.ФлагРежимОтладки;

	Элементы.КоличествоОбъектовНаТранзакцию.Доступность = Объект.ИспользоватьТранзакции;

КонецПроцедуры

&НаКлиенте
Процедура АрхивироватьФайлПриИзмененииЗначения()

	Если Объект.АрхивироватьФайл Тогда
		ИмяФайлаДанных = СтрЗаменить(ИмяФайлаДанных, ".xml", ".zip");
	Иначе
		ИмяФайлаДанных = СтрЗаменить(ИмяФайлаДанных, ".zip", ".xml");
	КонецЕсли;

	Элементы.ПарольДляСжатияФайлаОбмена.Доступность = Объект.АрхивироватьФайл;

КонецПроцедуры

&НаСервере
Процедура УстановитьУзелОбменаУСтрокДерева(Дерево, УзелОбмена)

	Для Каждого Строка Из Дерево Цикл

		Если Строка.ЭтоГруппа Тогда

			УстановитьУзелОбменаУСтрокДерева(Строка.ПолучитьЭлементы(), УзелОбмена);

		Иначе

			Строка.СсылкаНаУзелОбмена = УзелОбмена;

		КонецЕсли;

	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Функция ИменаФайловПравилИОбменаСовпадают()

	Если ВРег(СокрЛП(ИмяФайлаПравил)) = ВРег(СокрЛП(ИмяФайлаДанных)) Тогда

		СообщитьПользователю(НСтр("ru = 'Файл правил обмена не может совпадать с файлом данных.
								  |Выберите другой файл для выгрузки данных.'"));
		Возврат Истина;

	Иначе

		Возврат Ложь;

	КонецЕсли;

КонецФункции

// Заполняет дерево метаданных, доступных для удаления.
&НаСервере
Процедура ЗаполнитьСписокТиповДоступныхДляУдаления()

	ДеревоДанных = РеквизитФормыВЗначение("УдаляемыеДанные");

	ДеревоДанных.Строки.Очистить();

	СтрокаДерева = ДеревоДанных.Строки.Добавить();
	СтрокаДерева.Представление = НСтр("ru = 'Справочники'");

	Для Каждого ОбъектМД Из Метаданные.Справочники Цикл

		Если Не ПравоДоступа("Удаление", ОбъектМД) Тогда
			Продолжить;
		КонецЕсли;

		СтрокаМД = СтрокаДерева.Строки.Добавить();
		СтрокаМД.Представление = ОбъектМД.Имя;
		СтрокаМД.Метаданные = "СправочникСсылка." + ОбъектМД.Имя;

	КонецЦикла;

	СтрокаДерева = ДеревоДанных.Строки.Добавить();
	СтрокаДерева.Представление = НСтр("ru = 'Планы видов характеристик'");

	Для Каждого ОбъектМД Из Метаданные.ПланыВидовХарактеристик Цикл

		Если Не ПравоДоступа("Удаление", ОбъектМД) Тогда
			Продолжить;
		КонецЕсли;

		СтрокаМД = СтрокаДерева.Строки.Добавить();
		СтрокаМД.Представление = ОбъектМД.Имя;
		СтрокаМД.Метаданные = "ПланВидовХарактеристикСсылка." + ОбъектМД.Имя;

	КонецЦикла;

	СтрокаДерева = ДеревоДанных.Строки.Добавить();
	СтрокаДерева.Представление = НСтр("ru = 'Документы'");

	Для Каждого ОбъектМД Из Метаданные.Документы Цикл

		Если Не ПравоДоступа("Удаление", ОбъектМД) Тогда
			Продолжить;
		КонецЕсли;

		СтрокаМД = СтрокаДерева.Строки.Добавить();
		СтрокаМД.Представление = ОбъектМД.Имя;
		СтрокаМД.Метаданные = "ДокументСсылка." + ОбъектМД.Имя;

	КонецЦикла;

	СтрокаДерева = ДеревоДанных.Строки.Добавить();
	СтрокаДерева.Представление = "РегистрыСведений";

	Для Каждого ОбъектМД Из Метаданные.РегистрыСведений Цикл

		Если Не ПравоДоступа("Изменение", ОбъектМД) Тогда
			Продолжить;
		КонецЕсли;

		Подчинен = (ОбъектМД.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору);
		Если Подчинен Тогда
			Продолжить;
		КонецЕсли
		;

		СтрокаМД = СтрокаДерева.Строки.Добавить();
		СтрокаМД.Представление = ОбъектМД.Имя;
		СтрокаМД.Метаданные = "РегистрСведенийЗапись." + ОбъектМД.Имя;

	КонецЦикла;

	ЗначениеВРеквизитФормы(ДеревоДанных, "УдаляемыеДанные");

КонецПроцедуры

// Возвращает версию обработки.
&НаСервере
Функция ВерсияОбъектаСтрокойНаСервере()

	Возврат РеквизитФормыВЗначение("Объект").ВерсияОбъектаСтрокой();

КонецФункции

&НаКлиенте
Процедура ВыполнитьЗагрузкуПравилОбмена(АдресФайлаПравилВХранилище = "", ИмяФайлаДляРасширения = "")

	Объект.ФлагОшибки = Ложь;

	ЗагрузитьПравилаОбменаИПараметрыНаСервере(АдресФайлаПравилВХранилище, ИмяФайлаДляРасширения);

	Если Объект.ФлагОшибки Тогда

		УстановитьПризнакЗагрузкиПравил(Ложь);

	Иначе

		УстановитьПризнакЗагрузкиПравил(Истина);
		РазвернутьСтрокиДерева(Объект.ТаблицаПравилВыгрузки, Элементы.ТаблицаПравилВыгрузки, "Включить");

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура РазвернутьСтрокиДерева(ДеревоДанных, ПредставлениеНаФорме, ИмяФлажка)

	СтрокиДерева = ДеревоДанных.ПолучитьЭлементы();

	Для Каждого Строка Из СтрокиДерева Цикл

		ИдентификаторСтроки=Строка.ПолучитьИдентификатор();
		ПредставлениеНаФорме.Развернуть(ИдентификаторСтроки, Ложь);
		ВключитьРодителяЕслиВключеныПодчиненные(Строка, ИмяФлажка);

	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ВключитьРодителяЕслиВключеныПодчиненные(СтрокаДерева, ИмяФлажка)

	Включить = СтрокаДерева[ИмяФлажка];

	Для Каждого ПодчиненнаяСтрока Из СтрокаДерева.ПолучитьЭлементы() Цикл

		Если ПодчиненнаяСтрока[ИмяФлажка] = 1 Тогда

			Включить = 1;

		КонецЕсли;

		Если ПодчиненнаяСтрока.ПолучитьЭлементы().Количество() > 0 Тогда

			ВключитьРодителяЕслиВключеныПодчиненные(ПодчиненнаяСтрока, ИмяФлажка);

		КонецЕсли;

	КонецЦикла;

	СтрокаДерева[ИмяФлажка] = Включить;

КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененииПериода()

	Объект.ДатаНачала = ПериодВыгрузки.ДатаНачала;
	Объект.ДатаОкончания = ПериодВыгрузки.ДатаОкончания;

КонецПроцедуры

&НаСервере
Процедура ЗагрузитьПравилаОбменаИПараметрыНаСервере(АдресФайлаПравилВХранилище, ИмяФайлаДляРасширения)

	ИмяФайлаПравилОбмена = ИмяФайлаНаСервереИлиКлиенте(ИмяФайлаПравил, АдресФайлаПравилВХранилище,
		ИмяФайлаДляРасширения);

	Если ИмяФайлаПравилОбмена = Неопределено Тогда

		Возврат;

	Иначе

		Объект.ИмяФайлаПравилОбмена = ИмяФайлаПравилОбмена;

	КонецЕсли;

	ОбъектДляСервера = РеквизитФормыВЗначение("Объект");
	ОбъектДляСервера.ТаблицаПравилВыгрузки = РеквизитФормыВЗначение("Объект.ТаблицаПравилВыгрузки");
	ОбъектДляСервера.ТаблицаНастройкиПараметров = РеквизитФормыВЗначение("Объект.ТаблицаНастройкиПараметров");

	ОбъектДляСервера.ЗагрузитьПравилаОбмена();
	ОбъектДляСервера.ИнициализироватьПервоначальныеЗначенияПараметров();
	ОбъектДляСервера.Параметры.Очистить();
	Объект.ФлагОшибки = ОбъектДляСервера.ФлагОшибки;

	Если ЭтоКлиент Тогда

		УдалитьФайлы(Объект.ИмяФайлаПравилОбмена);

	КонецЕсли;

	ЗначениеВРеквизитФормы(ОбъектДляСервера.ТаблицаПравилВыгрузки, "Объект.ТаблицаПравилВыгрузки");
	ЗначениеВРеквизитФормы(ОбъектДляСервера.ТаблицаНастройкиПараметров, "Объект.ТаблицаНастройкиПараметров");

КонецПроцедуры

// Открывает диалог выбора файла.
//
&НаКлиенте
Процедура ВыборФайла(Элемент, ОбъектХранения, ИмяСвойства, ПроверятьСуществование, Знач РасширениеПоУмолчанию = "xml",
	АрхивироватьФайлДанных = Истина, ВыборФайлаПравил = Ложь)

	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

	Если РасширениеПоУмолчанию = "txt" Тогда

		ДиалогВыбораФайла.Фильтр = "Файл протокола обмена (*.txt)|*.txt";
		ДиалогВыбораФайла.Расширение = "txt";

	ИначеЕсли Объект.РежимОбмена = "Выгрузка" Тогда

		Если АрхивироватьФайлДанных Тогда

			ДиалогВыбораФайла.Фильтр = "Архивный файл данных (*.zip)|*.zip";
			ДиалогВыбораФайла.Расширение = "zip";

		ИначеЕсли ВыборФайлаПравил Тогда

			ДиалогВыбораФайла.Фильтр = "Файл данных (*.xml)|*.xml|Архивный файл данных (*.zip)|*.zip";
			ДиалогВыбораФайла.Расширение = "xml";

		Иначе

			ДиалогВыбораФайла.Фильтр = "Файл данных (*.xml)|*.xml";
			ДиалогВыбораФайла.Расширение = "xml";

		КонецЕсли;

	Иначе
		Если ВыборФайлаПравил Тогда
			ДиалогВыбораФайла.Фильтр = "Файл данных (*.xml)|*.xml";
			ДиалогВыбораФайла.Расширение = "xml";
		Иначе
			ДиалогВыбораФайла.Фильтр = "Файл данных (*.xml)|*.xml|Архивный файл данных (*.zip)|*.zip";
			ДиалогВыбораФайла.Расширение = "xml";
		КонецЕсли;
	КонецЕсли;

	ДиалогВыбораФайла.Заголовок = НСтр("ru = 'Выберите файл'");
	ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
	ДиалогВыбораФайла.ИндексФильтра = 0;
	ДиалогВыбораФайла.ПолноеИмяФайла = Элемент.ТекстРедактирования;
	ДиалогВыбораФайла.ПроверятьСуществованиеФайла = ПроверятьСуществование;

	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ОбъектХранения", ОбъектХранения);
	ДополнительныеПараметры.Вставить("ИмяСвойства", ИмяСвойства);
	ДополнительныеПараметры.Вставить("Элемент", Элемент);

	Оповещение = Новый ОписаниеОповещения("ДиалогВыбораФайлаОбработкаВыбора", ЭтотОбъект, ДополнительныеПараметры);
	ДиалогВыбораФайла.Показать(Оповещение);

КонецПроцедуры

// Параметры:
//   ВыбранныеФайлы - Массив из Строка - результат выбора файла.
//   ДополнительныеПараметры - Структура - произвольные дополнительные параметры:
//     * ОбъектХранения - Структура, ФормаКлиентскогоПриложения - приемник для хранения свойства.
//     * ИмяСвойства - Строка - имя свойства объекта хранения.
//     * Элемент - ПолеФормы - источник события выбора файла.
//
&НаКлиенте
Процедура ДиалогВыбораФайлаОбработкаВыбора(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ДополнительныеПараметры.ОбъектХранения[ДополнительныеПараметры.ИмяСвойства] = ВыбранныеФайлы[0];

	Элемент = ДополнительныеПараметры.Элемент;

	Если Элемент = Элементы.ИмяФайлаПравил Тогда
		ИмяФайлаПравилПриИзменении(Элемент);
	ИначеЕсли Элемент = Элементы.ИмяФайлаОбмена Тогда
		ИмяФайлаОбменаПриИзменении(Элемент);
	ИначеЕсли Элемент = Элементы.ИмяФайлаДанных Тогда
		ИмяФайлаДанныхПриИзменении(Элемент);
	ИначеЕсли Элемент = Элементы.ИмяФайлаПравилЗагрузки Тогда
		ИмяФайлаПравилЗагрузкиПриИзменении(Элемент);
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ВыполнитьПодключениеКИБПриемникуНаСервере()

	ОбъектДляСервера = РеквизитФормыВЗначение("Объект");
	ЗаполнитьЗначенияСвойств(ОбъектДляСервера, Объект);
	РезультатПодключения = ОбъектДляСервера.ВыполнитьПодключениеКИБПриемнику();

	Если РезультатПодключения <> Неопределено Тогда

		СообщитьПользователю(НСтр("ru = 'Подключение успешно установлено.'"));

	КонецЕсли;

КонецПроцедуры

// Устанавливает состояние пометки у подчиненных строк строки дерева значений
// в зависимости от пометки текущей строки.
//
// Параметры:
//  ТекСтрока      - Строка дерева значений.
// 
&НаКлиенте
Процедура УстановитьПометкиПодчиненных(ТекСтрока, ИмяФлажка)

	Подчиненные = ТекСтрока.ПолучитьЭлементы();

	Если Подчиненные.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	Для Каждого Строка Из Подчиненные Цикл

		Строка[ИмяФлажка] = ТекСтрока[ИмяФлажка];

		УстановитьПометкиПодчиненных(Строка, ИмяФлажка);

	КонецЦикла;

КонецПроцедуры

// Устанавливает состояние пометки у родительских строк строки дерева значений
// в зависимости от пометки текущей строки.
//
// Параметры:
//  ТекСтрока      - Строка дерева значений.
// 
&НаКлиенте
Процедура УстановитьПометкиРодителей(ТекСтрока, ИмяФлажка)

	Родитель = ТекСтрока.ПолучитьРодителя();
	Если Родитель = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ТекСостояние = Родитель[ИмяФлажка];

	НайденыВключенные  = Ложь;
	НайденыВыключенные = Ложь;

	Для Каждого Строка Из Родитель.ПолучитьЭлементы() Цикл
		Если Строка[ИмяФлажка] = 0 Тогда
			НайденыВыключенные = Истина;
		ИначеЕсли Строка[ИмяФлажка] = 1 Или Строка[ИмяФлажка] = 2 Тогда
			НайденыВключенные  = Истина;
		КонецЕсли;
		Если НайденыВключенные И НайденыВыключенные Тогда
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Если НайденыВключенные И НайденыВыключенные Тогда
		Включить = 2;
	ИначеЕсли НайденыВключенные И (Не НайденыВыключенные) Тогда
		Включить = 1;
	ИначеЕсли (Не НайденыВключенные) И НайденыВыключенные Тогда
		Включить = 0;
	ИначеЕсли (Не НайденыВключенные) И (Не НайденыВыключенные) Тогда
		Включить = 2;
	КонецЕсли;

	Если Включить = ТекСостояние Тогда
		Возврат;
	Иначе
		Родитель[ИмяФлажка] = Включить;
		УстановитьПометкиРодителей(Родитель, ИмяФлажка);
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ОткрытьФайлЗагрузкиНаСервере(АдресФайла)

	Если ЭтоКлиент Тогда

		ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайла); // ДвоичныеДанные
		АдресНаСервере = ПолучитьИмяВременногоФайла(".xml");
		// Удаление временного файла происходит не через УдалитьФайлы(АдресНаСервере), а через
		// УдалитьФайлы(Объект.ИмяФайлаОбмена) далее.
		ДвоичныеДанные.Записать(АдресНаСервере);
		Объект.ИмяФайлаОбмена = АдресНаСервере;

	Иначе

		ФайлНаСервере = Новый Файл(ИмяФайлаОбмена);

		Если Не ФайлНаСервере.Существует() Тогда

			СообщитьПользователю(НСтр("ru = 'Не найден файл обмена на сервере.'"), "ИмяФайлаОбмена");
			Возврат;

		КонецЕсли;

		Объект.ИмяФайлаОбмена = ИмяФайлаОбмена;

	КонецЕсли;

	ОбъектДляСервера = РеквизитФормыВЗначение("Объект");

	ОбъектДляСервера.ОткрытьФайлЗагрузки(Истина);

	Объект.ДатаНачала = ОбъектДляСервера.ДатаНачала;
	Объект.ДатаОкончания = ОбъектДляСервера.ДатаОкончания;
	Объект.ДатаВыгрузкиДанных = ОбъектДляСервера.ДатаВыгрузкиДанных;
	Объект.ВерсияПравилОбмена = ОбъектДляСервера.ВерсияПравилОбмена;
	Объект.Комментарий = ОбъектДляСервера.Комментарий;

КонецПроцедуры

// Удаляет помеченные строки дерева метаданных.
//
&НаСервере
Процедура УдалитьНаСервере()

	ОбъектДляСервера = РеквизитФормыВЗначение("Объект");
	ДеревоУдаляемыхДанных = РеквизитФормыВЗначение("УдаляемыеДанные");

	ОбъектДляСервера.ИнициализироватьМенеджерыИСообщения();

	Для Каждого СтрокаДерева Из ДеревоУдаляемыхДанных.Строки Цикл

		Для Каждого СтрокаМД Из СтрокаДерева.Строки Цикл

			Если Не СтрокаМД.Пометка Тогда
				Продолжить;
			КонецЕсли;

			ТипСтрокой = СтрокаМД.Метаданные;
			ОбъектДляСервера.УдалитьОбъектыТипа(ТипСтрокой);

		КонецЦикла;

	КонецЦикла;

КонецПроцедуры

// Устанавливает узел обмена у строк дерева.
//
&НаСервере
Процедура УстановитьУзелОбменаУСтрокДереваНаСервере(УзелОбмена)

	УстановитьУзелОбменаУСтрокДерева(Объект.ТаблицаПравилВыгрузки.ПолучитьЭлементы(), УзелОбмена);

КонецПроцедуры

// Сохраняет значения параметров.
//
&НаСервере
Процедура СохранитьПараметрыНаСервере()

	ТаблицаПараметров = РеквизитФормыВЗначение("Объект.ТаблицаНастройкиПараметров");

	СохраняемыеПараметры = Новый Соответствие;

	Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл
		СохраняемыеПараметры.Вставить(СтрокаТаблицы.Наименование, СтрокаТаблицы.Значение);
	КонецЦикла;

	ХранилищеСистемныхНастроек.Сохранить("УниверсальныйОбменДаннымиXML", "Параметры", СохраняемыеПараметры);

КонецПроцедуры

// Восстанавливает значения параметров.
//
&НаСервере
Процедура ВосстановитьПараметрыНаСервере()

	ТаблицаПараметров = РеквизитФормыВЗначение("Объект.ТаблицаНастройкиПараметров");
	ВосстановленныеПараметры = ХранилищеСистемныхНастроек.Загрузить("УниверсальныйОбменДаннымиXML", "Параметры");

	Если ТипЗнч(ВосстановленныеПараметры) <> Тип("Соответствие") Тогда
		Возврат;
	КонецЕсли;

	Если ВосстановленныеПараметры.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	Для Каждого Парам Из ВосстановленныеПараметры Цикл

		ИмяПараметра = Парам.Ключ;

		СтрокаТаблицы = ТаблицаПараметров.Найти(Парам.Ключ, "Наименование");

		Если СтрокаТаблицы <> Неопределено Тогда

			СтрокаТаблицы.Значение = Парам.Значение;

		КонецЕсли;

	КонецЦикла;

	ЗначениеВРеквизитФормы(ТаблицаПараметров, "Объект.ТаблицаНастройкиПараметров");

КонецПроцедуры

// Интерактивная выгрузка данных.
//
&НаКлиенте
Процедура ВыполнитьЗагрузкуИзФормы()

	АдресФайла = "";
	ИмяФайлаДляРасширения = "";

	ДобавитьСтрокуКСпискуВыбора(Элементы.ИмяФайлаОбмена.СписокВыбора, ИмяФайлаОбмена, ЗагрузкаДанныхИхФайла);

	Если ЭтоКлиент Тогда

		ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьЗагрузкуИзФормыЗавершение", ЭтотОбъект);
		НачатьПомещениеФайла(ОписаниеОповещения, АдресФайла, , , УникальныйИдентификатор);

	Иначе

		Если ПустоеЗначениеРеквизита(ИмяФайлаОбмена, "ИмяФайлаОбмена", Элементы.ИмяФайлаОбмена.Заголовок) Тогда
			Возврат;
		КонецЕсли;

		ВыполнитьЗагрузкуИзФормыЗавершение(Истина, АдресФайла, ИмяФайлаДляРасширения, Неопределено);

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьЗагрузкуИзФормыЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт

	Если Результат Тогда

		ВыполнитьЗагрузкуНаСервере(Адрес, ВыбранноеИмяФайла);

		ОткрытьДанныеПротоколовОбменаПриНеобходимости();

	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ВыполнитьЗагрузкуНаСервере(АдресФайла, ИмяФайлаДляРасширения)

	ИмяЗагружаемогоФайла = ИмяФайлаНаСервереИлиКлиенте(ИмяФайлаОбмена, АдресФайла, ИмяФайлаДляРасширения);

	Если ИмяЗагружаемогоФайла = Неопределено Тогда

		Возврат;

	Иначе

		Объект.ИмяФайлаОбмена = ИмяЗагружаемогоФайла;

	КонецЕсли;

	Если Объект.БезопаснаяЗагрузка Тогда
		Если ЭтоАдресВременногоХранилища(АдресФайлаПравилЗагрузкиВХранилище) Тогда
			ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаПравилЗагрузкиВХранилище); // ДвоичныеДанные
			АдресНаСервере = ПолучитьИмяВременногоФайла("xml");
			// Удаление временного файла происходит не через УдалитьФайлы(АдресНаСервере), а через
			// УдалитьФайлы(Объект.ИмяФайлаПравилОбмена) далее.
			ДвоичныеДанные.Записать(АдресНаСервере);
			Объект.ИмяФайлаПравилОбмена = АдресНаСервере;
		Иначе
			СообщитьПользователю(НСтр("ru = 'Не указан файл правил для загрузки данных.'"));
			Возврат;
		КонецЕсли;
	КонецЕсли;

	ОбъектДляСервера = РеквизитФормыВЗначение("Объект");
	ЗаполнитьЗначенияСвойств(ОбъектДляСервера, Объект);
	ОбъектДляСервера.ВыполнитьЗагрузку();

	Попытка

		Если Не ПустаяСтрока(АдресФайла) Тогда
			УдалитьФайлы(ИмяЗагружаемогоФайла);
		КонецЕсли;

	Исключение
		ЗаписьЖурналаРегистрации(НСтр("ru = 'Универсальный обмен данными в формате XML'",
			ОбъектДляСервера.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(
			ИнформацияОбОшибке()));
	КонецПопытки;

	ОбъектДляСервера.Параметры.Очистить();
	ЗначениеВРеквизитФормы(ОбъектДляСервера, "Объект");

	ПравилаЗагружены = Ложь;
	Элементы.ФормаВыполнитьВыгрузку.Доступность = Ложь;
	Элементы.НадписьПояснениеВыгрузки.Видимость = Истина;
	Элементы.ГруппаВыгрузкаОтладкаДоступна.Доступность = Ложь;

КонецПроцедуры

&НаСервере
Функция ИмяФайлаНаСервереИлиКлиенте(ИмяРеквизита, Знач АдресФайла, Знач ИмяФайлаДляРасширения = ".xml",
	СоздатьНовый = Ложь, ПроверятьСуществование = Истина)

	ИмяФайла = Неопределено;

	Если ЭтоКлиент Тогда

		Если СоздатьНовый Тогда

			Расширение = ?(Объект.АрхивироватьФайл, ".zip", ".xml");

			ИмяФайла = ПолучитьИмяВременногоФайла(Расширение);

		Иначе

			Расширение = РасширениеФайла(ИмяФайлаДляРасширения);
			ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайла); // ДвоичныеДанные
			АдресНаСервере = ПолучитьИмяВременногоФайла(Расширение);
			// Удаление временного файла происходит не через УдалитьФайлы(АдресНаСервере),
			// а через УдалитьФайлы(Объект.ИмяФайлаПравилОбмена) и УдалитьФайлы(Объект.ИмяФайлаОбмена) далее.
			ДвоичныеДанные.Записать(АдресНаСервере);
			ИмяФайла = АдресНаСервере;

		КонецЕсли;

	Иначе

		ФайлНаСервере = Новый Файл(ИмяРеквизита);

		Если Не ФайлНаСервере.Существует() И ПроверятьСуществование Тогда

			СообщитьПользователю(НСтр("ru = 'Указанный файл не существует.'"));

		Иначе

			ИмяФайла = ИмяРеквизита;

		КонецЕсли;

	КонецЕсли;

	Возврат ИмяФайла;

КонецФункции

&НаСервере
Функция РасширениеФайла(Знач ИмяФайла)

	ПозицияТочки = ПоследнийРазделитель(ИмяФайла);

	Расширение = Прав(ИмяФайла, СтрДлина(ИмяФайла) - ПозицияТочки + 1);

	Возврат Расширение;

КонецФункции

&НаСервере
Функция ПоследнийРазделитель(СтрокаСРазделителем, Разделитель = ".")

	ДлинаСтроки = СтрДлина(СтрокаСРазделителем);

	Пока ДлинаСтроки > 0 Цикл

		Если Сред(СтрокаСРазделителем, ДлинаСтроки, 1) = Разделитель Тогда

			Возврат ДлинаСтроки;

		КонецЕсли;

		ДлинаСтроки = ДлинаСтроки - 1;

	КонецЦикла;

КонецФункции

&НаКлиенте
Процедура ВыполнитьВыгрузкуИзФормы()
	
	// Запомним файл правил и файл выгрузки.
	ДобавитьСтрокуКСпискуВыбора(Элементы.ИмяФайлаПравил.СписокВыбора, ИмяФайлаПравил, ПравилаОбмена);

	Если Не Объект.НепосредственноеЧтениеВИБПриемнике И Не ЭтоКлиент Тогда

		Если ИменаФайловПравилИОбменаСовпадают() Тогда
			Возврат;
		КонецЕсли;

		ДобавитьСтрокуКСпискуВыбора(Элементы.ИмяФайлаДанных.СписокВыбора, ИмяФайлаДанных, ВыгрузкаДанныхВФайл);

	КонецЕсли;

	АдресФайлаДанныхВХранилище = ВыполнитьВыгрузкуНаСервере();

	Если АдресФайлаДанныхВХранилище = Неопределено Тогда
		Возврат;
	КонецЕсли;

	РазвернутьСтрокиДерева(Объект.ТаблицаПравилВыгрузки, Элементы.ТаблицаПравилВыгрузки, "Включить");

	Если ЭтоКлиент И Не ПрямаяВыгрузка И Не Объект.ФлагОшибки Тогда

		ИмяСохраняемогоФайла = ?(Объект.АрхивироватьФайл, НСтр("ru = 'Файл выгрузки.zip'"), НСтр(
			"ru = 'Файл выгрузки.xml'"));

		ПолучитьФайл(АдресФайлаДанныхВХранилище, ИмяСохраняемогоФайла);

	КонецЕсли
	;

	ОткрытьДанныеПротоколовОбменаПриНеобходимости();

КонецПроцедуры

&НаСервере
Функция ВыполнитьВыгрузкуНаСервере()

	Объект.ИмяФайлаПравилОбмена = ИмяФайлаНаСервереИлиКлиенте(ИмяФайлаПравил, АдресФайлаПравилВХранилище);

	Если Не ПрямаяВыгрузка Тогда

		ИмяВременногоФайлаДанных = ИмяФайлаНаСервереИлиКлиенте(ИмяФайлаДанных, "", , Истина, Ложь);

		Если ИмяВременногоФайлаДанных = Неопределено Тогда

			СообщитьПользователю(НСтр("ru = 'Не определен файл данных'"));
			Возврат Неопределено;

		Иначе

			Объект.ИмяФайлаОбмена = ИмяВременногоФайлаДанных;

		КонецЕсли;
	//УИ++
	ИначеЕсли ПрямаяВыгрузка = 2 Тогда
		ИмяВременногоФайлаДанных=ПолучитьИмяВременногоФайла(".xml");
		Объект.ИмяФайлаОбмена = ИмяВременногоФайлаДанных;
		Объект.УИ_ВыгрузкаЧерезВебСервис=Истина;
	//УИ--

	КонецЕсли;

	ТаблицаПравилВыгрузки = РеквизитФормыВЗначение("Объект.ТаблицаПравилВыгрузки");
	ТаблицаНастройкиПараметров = РеквизитФормыВЗначение("Объект.ТаблицаНастройкиПараметров");

	ОбъектДляСервера = РеквизитФормыВЗначение("Объект");
	ЗаполнитьЗначенияСвойств(ОбъектДляСервера, Объект);

	Если ОбъектДляСервера.ФлагРежимОтладкиОбработчиков Тогда

		Отказ = Ложь;

		Файл = Новый Файл(ОбъектДляСервера.ИмяФайлаВнешнейОбработкиОбработчиковСобытий);

		Если Не Файл.Существует() Тогда

			СообщитьПользователю(НСтр("ru = 'Файл внешней обработки отладчиков событий не существует на сервере'"));
			Возврат Неопределено;

		КонецЕсли;

		ОбъектДляСервера.ВыгрузитьОбработчикиСобытий(Отказ);

		Если Отказ Тогда

			СообщитьПользователю(НСтр("ru = 'Не удалось выгрузить обработчики событий'"));
			Возврат "";

		КонецЕсли;

	Иначе

		ОбъектДляСервера.ЗагрузитьПравилаОбмена();
		ОбъектДляСервера.ИнициализироватьПервоначальныеЗначенияПараметров();

	КонецЕсли;

	ИзменитьДеревоПравилВыгрузки(ОбъектДляСервера.ТаблицаПравилВыгрузки.Строки, ТаблицаПравилВыгрузки.Строки);
	ИзменитьТаблицуПараметров(ОбъектДляСервера.ТаблицаНастройкиПараметров, ТаблицаНастройкиПараметров);

	ОбъектДляСервера.ВыполнитьВыгрузку();
	ОбъектДляСервера.ТаблицаПравилВыгрузки = РеквизитФормыВЗначение("Объект.ТаблицаПравилВыгрузки");

	Если ЭтоКлиент И Не ПрямаяВыгрузка Тогда

		АдресФайлаДанных = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(Объект.ИмяФайлаОбмена),
			УникальныйИдентификатор);
		УдалитьФайлы(Объект.ИмяФайлаОбмена);
	
	//УИ++
	ИначеЕсли ПрямаяВыгрузка = 2 Тогда
		АдресФайлаДанных = "";
		УдалитьФайлы(Объект.ИмяФайлаОбмена);
			
	//УИ--	

	Иначе

		АдресФайлаДанных = "";

	КонецЕсли;

	Если ЭтоКлиент Тогда

		УдалитьФайлы(ОбъектДляСервера.ИмяФайлаПравилОбмена);

	КонецЕсли;

	ОбъектДляСервера.Параметры.Очистить();
	ЗначениеВРеквизитФормы(ОбъектДляСервера, "Объект");

	Возврат АдресФайлаДанных;

КонецФункции

&НаКлиенте
Процедура УстановитьДоступностьКомандОтладки()
	;
	
	Элементы.НастройкаОтладкиЗагрузки.Доступность = Объект.ФлагРежимОтладкиОбработчиков;
	Элементы.НастройкаОтладкиВыгрузки.Доступность = Объект.ФлагРежимОтладкиОбработчиков;

КонецПроцедуры

// Изменяет дерево ПВД в соответствии с деревом на форме.
//
&НаСервере
Процедура ИзменитьДеревоПравилВыгрузки(СтрокиИсходногоДерева, СтрокиЗаменяемогоДерева)

	КолонкаВключить = СтрокиЗаменяемогоДерева.ВыгрузитьКолонку("Включить");
	СтрокиИсходногоДерева.ЗагрузитьКолонку(КолонкаВключить, "Включить");
	КолонкаУзел = СтрокиЗаменяемогоДерева.ВыгрузитьКолонку("СсылкаНаУзелОбмена");
	СтрокиИсходногоДерева.ЗагрузитьКолонку(КолонкаУзел, "СсылкаНаУзелОбмена");

	КолонкаИспользоватьОтбор = СтрокиЗаменяемогоДерева.ВыгрузитьКолонку("ИспользоватьОтбор");
	СтрокиИсходногоДерева.ЗагрузитьКолонку(КолонкаИспользоватьОтбор, "ИспользоватьОтбор");

	КолонкаОтбор = СтрокиЗаменяемогоДерева.ВыгрузитьКолонку("Отбор");
	СтрокиИсходногоДерева.ЗагрузитьКолонку(КолонкаОтбор, "Отбор");

	КолонкаИмяМетаданных = СтрокиЗаменяемогоДерева.ВыгрузитьКолонку("ИмяМетаданных");
	СтрокиИсходногоДерева.ЗагрузитьКолонку(КолонкаИмяМетаданных, "ИмяМетаданных");
	Для Каждого СтрокаИсходногоДерева Из СтрокиИсходногоДерева Цикл

		ИндексСтроки = СтрокиИсходногоДерева.Индекс(СтрокаИсходногоДерева);
		СтрокаИзменяемогоДерева = СтрокиЗаменяемогоДерева.Получить(ИндексСтроки);

		ИзменитьДеревоПравилВыгрузки(СтрокаИсходногоДерева.Строки, СтрокаИзменяемогоДерева.Строки);

	КонецЦикла;

КонецПроцедуры

// Изменяет таблицу параметров в соответствии с таблицей на форме.
//
&НаСервере
Процедура ИзменитьТаблицуПараметров(ТаблицаБазы, ТаблицаФормы)

	КолонкаНаименование = ТаблицаФормы.ВыгрузитьКолонку("Наименование");
	ТаблицаБазы.ЗагрузитьКолонку(КолонкаНаименование, "Наименование");
	КолонкаЗначение = ТаблицаФормы.ВыгрузитьКолонку("Значение");
	ТаблицаБазы.ЗагрузитьКолонку(КолонкаЗначение, "Значение");

КонецПроцедуры

&НаКлиенте
Процедура ПрямаяВыгрузкаПриИзмененииЗначения()

	ПараметрыВыгрузки = Элементы.ПараметрыВыгрузки;
	
	//УИ++
//	ПараметрыВыгрузки.ТекущаяСтраница = ?(ПрямаяВыгрузка = 0,
//										  ПараметрыВыгрузки.ПодчиненныеЭлементы.ВыгрузкаВФайл,
//										  ПараметрыВыгрузки.ПодчиненныеЭлементы.ВыгрузкаВИБПриемник);
	Если ПрямаяВыгрузка = 0 Тогда
		ПараметрыВыгрузки.ТекущаяСтраница=ПараметрыВыгрузки.ПодчиненныеЭлементы.ВыгрузкаВФайл;
	ИначеЕсли ПрямаяВыгрузка = 1 Тогда
		ПараметрыВыгрузки.ТекущаяСтраница=ПараметрыВыгрузки.ПодчиненныеЭлементы.ВыгрузкаВИБПриемник;
	Иначе
		ПараметрыВыгрузки.ТекущаяСтраница=ПараметрыВыгрузки.ПодчиненныеЭлементы.УИ_ГруппаВыгрузкаЧерезВебСервис;
	КонецЕсли;

	Объект.УИ_ВыгрузкаЧерезВебСервис=(ПрямаяВыгрузка = 2);
	//УИ--

	Объект.НепосредственноеЧтениеВИБПриемнике = (ПрямаяВыгрузка = 1);

	ТипИнформационнойБазыДляПодключенияПриИзмененииЗначения();

КонецПроцедуры

&НаКлиенте
Процедура ТипИнформационнойБазыДляПодключенияПриИзмененииЗначения()

	ТипБазы = Элементы.ТипБазы;
	ТипБазы.ТекущаяСтраница = ?(Объект.ТипИнформационнойБазыДляПодключения, ТипБазы.ПодчиненныеЭлементы.ФайловаяБаза,
		ТипБазы.ПодчиненныеЭлементы.БазаНаСервере);

КонецПроцедуры

&НаКлиенте
Процедура ДобавитьСтрокуКСпискуВыбора(СписокСохраняемыхЗначений, ЗначениеСохранения, ИмяПараметраДляСохранения)

	Если ПустаяСтрока(ЗначениеСохранения) Тогда
		Возврат;
	КонецЕсли;

	НайденныйЭлемент = СписокСохраняемыхЗначений.НайтиПоЗначению(ЗначениеСохранения);
	Если НайденныйЭлемент <> Неопределено Тогда
		СписокСохраняемыхЗначений.Удалить(НайденныйЭлемент);
	КонецЕсли;

	СписокСохраняемыхЗначений.Вставить(0, ЗначениеСохранения);

	Пока СписокСохраняемыхЗначений.Количество() > 10 Цикл
		СписокСохраняемыхЗначений.Удалить(СписокСохраняемыхЗначений.Количество() - 1);
	КонецЦикла;

	ИмяПараметраДляСохранения = СписокСохраняемыхЗначений;

КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФормуНастройкиОтладкиОбработчиков(ОбработчикиСобытийИзФайлаПравил)

	ИмяОбработки = Лев(ИмяФормы, ПоследнийРазделитель(ИмяФормы));
	ИмяВызываемойФормы = ИмяОбработки + "УправляемаяФормаНастройкиОтладкиОбработчиков";

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ИмяФайлаВнешнейОбработкиОбработчиковСобытий",
		Объект.ИмяФайлаВнешнейОбработкиОбработчиковСобытий);
	ПараметрыФормы.Вставить("РежимОтладкиАлгоритмов", Объект.РежимОтладкиАлгоритмов);
	ПараметрыФормы.Вставить("ИмяФайлаПравилОбмена", Объект.ИмяФайлаПравилОбмена);
	ПараметрыФормы.Вставить("ИмяФайлаОбмена", Объект.ИмяФайлаОбмена);
	ПараметрыФормы.Вставить("ОбработчикиСобытийЧитаемИзФайлаПравилОбмена", ОбработчикиСобытийИзФайлаПравил);
	ПараметрыФормы.Вставить("ИмяОбработки", ИмяОбработки);

	Режим = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
	Обработчик = Новый ОписаниеОповещения("ОткрытьФормуНастройкиОтладкиОбработчиковЗавершение", ЭтотОбъект,
		ОбработчикиСобытийИзФайлаПравил);

	ОткрытьФорму(ИмяВызываемойФормы, ПараметрыФормы, ЭтотОбъект, , , , Обработчик, Режим);

КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФормуНастройкиОтладкиОбработчиковЗавершение(ПараметрыОтладки, ОбработчикиСобытийИзФайлаПравил) Экспорт

	Если ПараметрыОтладки <> Неопределено Тогда

		ЗаполнитьЗначенияСвойств(Объект, ПараметрыОтладки);

		Если ЭтоКлиент Тогда

			Если ОбработчикиСобытийИзФайлаПравил Тогда

				ИмяФайла = Объект.ИмяФайлаПравилОбмена;

			Иначе

				ИмяФайла = Объект.ИмяФайлаОбмена;

			КонецЕсли;

			Оповещение = Новый ОписаниеОповещения("ОткрытьФормуНастройкиОтладкиОбработчиковЗавершениеУдалениеФайлов",
				ЭтотОбъект);
			НачатьУдалениеФайлов(Оповещение, ИмяФайла);

		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФормуНастройкиОтладкиОбработчиковЗавершениеУдалениеФайлов(ДополнительныеПараметры) Экспорт

	Возврат;

КонецПроцедуры

&НаКлиенте
Процедура ИзменитьРасположениеФайла()

	Элементы.ИмяФайлаПравил.Видимость = Не ЭтоКлиент;
	Элементы.ИмяФайлаДанных.Видимость = Не ЭтоКлиент;
	Элементы.ИмяФайлаОбмена.Видимость = Не ЭтоКлиент;
	Элементы.ГруппаБезопаснаяЗагрузка.Видимость = Не ЭтоКлиент;

	УстановитьПризнакЗагрузкиПравил(Ложь);

КонецПроцедуры

&НаКлиенте
Процедура ИзменитьРежимОбработки(РежимРаботы)

	ГруппаРежима = КоманднаяПанель.ПодчиненныеЭлементы.РежимОбработки.ПодчиненныеЭлементы;

	ГруппаРежима.ФормаНаКлиенте.Пометка = РежимРаботы;
	ГруппаРежима.ФормаНаСервере.Пометка = Не РежимРаботы;

	КоманднаяПанель.ПодчиненныеЭлементы.РежимОбработки.Заголовок = ?(РежимРаботы, НСтр(
		"ru = 'Режим работы (на клиенте)'"), НСтр("ru = 'Режим работы (на сервере)'"));

	Объект.ТаблицаПравилВыгрузки.ПолучитьЭлементы().Очистить();
	Объект.ТаблицаНастройкиПараметров.Очистить();

	ИзменитьРасположениеФайла();

КонецПроцедуры

&НаКлиенте
Процедура ОткрытьДанныеПротоколовОбменаПриНеобходимости()

	Если Не Объект.ОткрыватьПротоколыОбменаПослеВыполненияОпераций Тогда
		Возврат;
	КонецЕсли;

#Если Не ВебКлиент Тогда

	Если Не ПустаяСтрока(Объект.ИмяФайлаПротоколаОбмена) Тогда
		ОткрытьВПриложении(Объект.ИмяФайлаПротоколаОбмена);
	КонецЕсли;

	Если Объект.НепосредственноеЧтениеВИБПриемнике Тогда

		Объект.ИмяФайлаПротоколаОбменаЗагрузка = ПолучитьИмяПротоколаДляВторойИнформационнойБазыComСоединенияНаСервере();

		Если Не ПустаяСтрока(Объект.ИмяФайлаПротоколаОбменаЗагрузка) Тогда
			ОткрытьВПриложении(Объект.ИмяФайлаПротоколаОбменаЗагрузка);
		КонецЕсли;

	КонецЕсли;

#КонецЕсли

КонецПроцедуры

&НаСервере
Функция ПолучитьИмяПротоколаДляВторойИнформационнойБазыComСоединенияНаСервере()

	Возврат РеквизитФормыВЗначение("Объект").ПолучитьИмяПротоколаДляВторойИнформационнойБазыComСоединения();

КонецФункции

&НаКлиенте
Функция ПустоеЗначениеРеквизита(Реквизит, ПутьКДанным, Заголовок)

	Если ПустаяСтрока(Реквизит) Тогда

		ТекстСообщения = НСтр("ru = 'Поле ""%1"" не заполнено'");
		ТекстСообщения = СтрЗаменить(ТекстСообщения, "%1", Заголовок);

		СообщитьПользователю(ТекстСообщения, ПутьКДанным);

		Возврат Истина;

	Иначе

		Возврат Ложь;

	КонецЕсли;

КонецФункции

&НаКлиенте
Процедура УстановитьПризнакЗагрузкиПравил(Признак)

	ПравилаЗагружены = Признак;
	Элементы.ФормаВыполнитьВыгрузку.Доступность = Признак;
	Элементы.НадписьПояснениеВыгрузки.Видимость = Не Признак;
	Элементы.ГруппаОтладкиВыгрузки.Доступность = Признак;

КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененииТипаУдаленияРегистрацииИзменений()

	Если ПустаяСтрока(ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки) Тогда
		Объект.ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки = 0;
	Иначе
		Объект.ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки = Число(
			ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки);
	КонецЕсли;

КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура СообщитьПользователю(Текст, ПутьКДанным = "")

	Сообщение = Новый СообщениеПользователю;
	Сообщение.Текст = Текст;
	Сообщение.ПутьКДанным = ПутьКДанным;
	Сообщение.Сообщить();

КонецПроцедуры

// Возвращает Истина, если клиентское приложение запущено под управлением ОС Windows.
//
// Возвращаемое значение:
//  Булево -  Если нет клиентского приложения, возвращается Ложь.
//
&НаКлиенте
Функция ЭтоWindowsКлиент()

	СистемнаяИнформация = Новый СистемнаяИнформация;

	ЭтоWindowsКлиент = СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Или СистемнаяИнформация.ТипПлатформы
		= ТипПлатформы.Windows_x86_64;

	Возврат ЭтоWindowsКлиент;

КонецФункции

&НаСервере
Процедура ПроверитьВерсиюИРежимСовместимостиПлатформы()

	Информация = Новый СистемнаяИнформация;
	Если Не (Лев(Информация.ВерсияПриложения, 3) = "8.3" И (Метаданные.РежимСовместимости
		= Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или (Метаданные.РежимСовместимости
		<> Метаданные.СвойстваОбъектов.РежимСовместимости.Версия8_1 И Метаданные.РежимСовместимости
		<> Метаданные.СвойстваОбъектов.РежимСовместимости.Версия8_2_13 И Метаданные.РежимСовместимости
		<> Метаданные.СвойстваОбъектов.РежимСовместимости["Версия8_2_16"] И Метаданные.РежимСовместимости
		<> Метаданные.СвойстваОбъектов.РежимСовместимости["Версия8_3_1"] И Метаданные.РежимСовместимости
		<> Метаданные.СвойстваОбъектов.РежимСовместимости["Версия8_3_2"]))) Тогда

		ВызватьИсключение НСтр("ru = 'Обработка предназначена для запуска на версии платформы
							   |1С:Предприятие 8.3 с отключенным режимом совместимости или выше'");

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ИзменитьРежимБезопаснаяЗагрузка(Интерактивно = Истина)

	Элементы.ГруппаБезопаснаяЗагрузка.Доступность = Объект.БезопаснаяЗагрузка;

	ЧерезХранилище = ЭтоКлиент;
#Если ВебКлиент Тогда
	ЧерезХранилище = Истина;
#КонецЕсли

	Если Объект.БезопаснаяЗагрузка И ЧерезХранилище Тогда
		ПоместитьФайлПравилЗагрузкиВХранилище();
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПоместитьФайлПравилЗагрузкиВХранилище()

	ЧерезХранилище = ЭтоКлиент;
#Если ВебКлиент Тогда
	ЧерезХранилище = Истина;
#КонецЕсли

	АдресФайла = "";
	ОписаниеОповещения = Новый ОписаниеОповещения("ПоместитьФайлПравилЗагрузкиВХранилищеЗавершить", ЭтотОбъект);

	Если ЧерезХранилище Тогда
		НачатьПомещениеФайла(ОписаниеОповещения, АдресФайла, , , УникальныйИдентификатор);
	Иначе
		НачатьПомещениеФайла(ОписаниеОповещения, АдресФайла, ИмяФайлаПравилЗагрузки, Ложь, УникальныйИдентификатор);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПоместитьФайлПравилЗагрузкиВХранилищеЗавершить(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт

	Если Результат Тогда
		АдресФайлаПравилЗагрузкиВХранилище = Адрес;
	КонецЕсли;

КонецПроцедуры
&НаСервере
Функция ИнициализироватьКомпоновщикНастроекОтбораПравилВыгрузки(Знач ИндексСтроки = Неопределено,
	Знач СтрокаДереваМетаданных = Неопределено)

	Если СтрокаДереваМетаданных = Неопределено Тогда
		СтрокаДереваМетаданных = Объект.ТаблицаПравилВыгрузки.НайтиПоИдентификатору(ИндексСтроки);
	КонецЕсли;

	ОбъектОбработка = РеквизитФормыВЗначение("Объект");
	ТекстЗапроса = ОбъектОбработка.ПолучитьТекстЗапросаПоСтроке(СтрокаДереваМетаданных, Ложь);
	СхемаКомпоновкиДанных = ОбъектОбработка.СхемаКомпоновкиДанных(ТекстЗапроса);
	КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
	КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(ПоместитьВоВременноеХранилище(
		СхемаКомпоновкиДанных, УникальныйИдентификатор)));
	КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

	ЕстьДополнительныеОтборы  = СтрокаДереваМетаданных.Отбор.Элементы.Количество() <> 0;

	Если ЕстьДополнительныеОтборы Тогда
		УИ_ОбщегоНазначенияКлиентСервер.СкопироватьЭлементы(КомпоновщикНастроек.Настройки.Отбор,
			СтрокаДереваМетаданных.Отбор);
	КонецЕсли;

	Возврат КомпоновщикНастроек;

КонецФункции
#КонецОбласти